package com.xiao.job;

import com.xiao.domain.constants.ArticleConstants;
import com.xiao.domain.pojo.Article;
import com.xiao.service.ArticleService;
import com.xiao.utils.RedisCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Component
public class UpdateViewCountJob {

    @Autowired
    private RedisCache redisCache;

    @Autowired
    private ArticleService articleService;


    @Scheduled(cron = "0 0/10 * * * ?")// 先这设置成 5s 更新 以便我们观察; (生产时: 10分钟持久化一次) 0 表示 00秒 * 表示 任意秒,那就会都执行
    public void updateViewCount(){
        // 1. 获取 Redis 中的浏览量
        Map<String, Integer> viewCount = redisCache.getCacheMap(ArticleConstants.ARTICLE_VIEW_COUNT);
        // 2. 转化为 set 因为 map 不能直接使用 stream
        Set<Map.Entry<String, Integer>> viewCountSet = viewCount.entrySet(); // 返回 映射项，即键值对

        // 3. 操作流 (需要把数据,封装到 实体类 为 存储到数据库中 做准备)
        List<Article> collect = viewCountSet.stream()
                .map(
                        entry -> {
                            Article article = new Article();
                            article.setId(Long.valueOf(entry.getKey()));
                            article.setViewCount(entry.getValue().longValue());// Long 需要 entry.getValue().longValue() 拆箱成基本类型;
                            return article;
                        }).collect(Collectors.toList());

        // 4. 存储到数据库中
        articleService.updateBatchById(collect);// updateBatchById 批量更新 updateById 单个更新
    }

}
